home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 July / Macworld (1999-07).dmg / Shareware World / Comms & Internet / HTML and CSS modes / HTML and CSS Modes / htmlStatusBar.tcl < prev    next >
Text File  |  1999-04-24  |  18KB  |  629 lines

  1. ## -*-Tcl-*-
  2.  # ###################################################################
  3.  #  HTML mode - tools for editing HTML documents
  4.  # 
  5.  #  FILE: "htmlStatusBar.tcl"
  6.  #                                    created: 96-06-16 14.24.31 
  7.  #                                last update: 99-04-24 13.17.08 
  8.  #  Author: Johan Linde
  9.  #  E-mail: <jlinde@telia.com>
  10.  #     www: <http://www.theophys.kth.se/~jl/Alpha.html>
  11.  #  
  12.  # Version: 2.1.4
  13.  # 
  14.  # Copyright 1996-1999 by Johan Linde
  15.  #  
  16.  # This software may be used freely, and distributed freely, as long as the 
  17.  # receiver is not obligated in any way by receiving it.
  18.  #  
  19.  # If you make improvements to this file, please share them!
  20.  # 
  21.  # ###################################################################
  22.  ##
  23.  
  24. proc htmlStatusBar.tcl {} {}
  25.  
  26. # Opening or only tag of an element - include attributes
  27. # Status bar for each attribute.
  28. # Return empty string if user skips an attribute which must be used.
  29. proc htmlOpenElemStatusBar {elem used wrPos {values ""} {addNotUsed 0} {addHidden 0} {absPos ""}} {
  30.     global htmlActiveElem htmlActiveUsed htmlActiveAttr htmlActiveCache
  31.     global HTMLmodeVars htmlElemEventHandler1 htmlFirstAttr
  32.     global htmlURLAttr htmlColorAttr htmlWindowAttr htmlWrapPos
  33.     global htmlSpecURL htmlSpecColor htmlSpecWindow  htmlActiveWidth htmlActiveHeight
  34.     
  35.     set promptNoisily $HTMLmodeVars(promptNoisily)
  36.     
  37.     if {![string length $used]} {set used $elem}
  38.     set elem [string toupper $elem]
  39.     set used [string toupper $used]
  40.     
  41.     set htmlActiveUsed $used
  42.     set htmlActiveElem $elem
  43.     set text "<"
  44.     append text [htmlSetCase $elem]
  45.  
  46.     # if there are attributes to ask about, do so
  47.     set reqatts [htmlGetRequired $used]
  48.     set eventatts [htmlGetSomeAttrs $used EventHandler 1]
  49.     set optatts [htmlGetOptional $used]
  50.     set allatts [htmlGetUsed $used $reqatts $optatts]
  51.     set NumberAttrs [htmlGetNumber $used]
  52.     regsub -all "\[ \n\r\t]+([join $allatts |])" " $optatts" " " notUsedAtts
  53.     if {$addNotUsed} {
  54.         append allatts " " $notUsedAtts
  55.         set notUsedAtts ""
  56.     }
  57.     if {$addHidden} {
  58.         regsub -all "\[ \n\r\t]+([join $optatts |])" " [htmlGetOptional $used 1]" " " hiddenAtts
  59.         append allatts " $hiddenAtts"
  60.     }
  61.     set useatts $allatts
  62.     append allatts " " $notUsedAtts
  63.     set htmlActiveWidth ""
  64.     set htmlActiveHeight ""
  65.     
  66.     # wrapping
  67.     if {$absPos == ""} {set absPos [getPos]}
  68.     set htmlWrapPos [expr $wrPos == -1 ? [posX [getPos]] : $wrPos]
  69.     incr htmlWrapPos [expr [string length $text] + 1]
  70.     for {set i 0} {$i < [llength $allatts] && [llength $useatts]} {incr i} {
  71.         set htmlFirstAttr [expr !$i]
  72.         set attr [lindex $allatts $i]
  73.         if {[lsearch -exact $reqatts $attr] >= 0} {
  74.             set required 1
  75.         } else {
  76.             set required 0
  77.         }
  78.         set htmlActiveAttr $attr
  79.         set a2 [string trimright $attr =]
  80.         if {[string index $attr [expr [string length $attr] - 1]] == "="} {
  81.             if {([lsearch -exact $htmlURLAttr $attr] >= 0 && [lsearch -exact $htmlSpecURL "${used}!=$a2"] < 0) || \
  82.             [lsearch -exact $htmlSpecURL "${used}=$a2"] >= 0} { 
  83.                 # URL attibute
  84.                 set htmlActiveCache URLs
  85.                 if {[catch {htmlAskURL $attr $required [lindex $values $i]} v]} {
  86.                     if {$v != "Skip rest!"} {
  87.                         error ""
  88.                     } elseif {!$required} {
  89.                         set i [llength $allatts]
  90.                     } else {
  91.                         set v ""
  92.                     }
  93.                 } elseif {[string length $v]} {
  94.                     append text [htmlWrapTag "[htmlSetCase $attr][htmlAddQuotes [htmlURLescape2 $v]]"]
  95.                 }
  96.             } elseif {([lsearch -exact $htmlColorAttr $attr] >= 0 && [lsearch -exact $htmlSpecColor "${used}!=$a2"] < 0) || \
  97.             [lsearch -exact $htmlSpecColor "${used}=$a2"] >= 0} { 
  98.                 # Color attribute
  99.                 if {[catch {htmlAskColor $attr $required [lindex $values $i]} v]} {
  100.                     if {$v != "Skip rest!"} {
  101.                         error ""
  102.                     } elseif {!$required} {
  103.                         set i [llength $allatts]
  104.                     } else {
  105.                         set v ""
  106.                     }
  107.                 } elseif {[string length $v]} {
  108.                     append text [htmlWrapTag "[htmlSetCase $attr][htmlAddQuotes $v]"]
  109.                 }
  110.             } elseif {([lsearch -exact $htmlWindowAttr $attr] >= 0 && [lsearch -exact $htmlSpecWindow "${used}!=$a2"] < 0) || \
  111.             [lsearch -exact $htmlSpecWindow "${used}=$a2"] >= 0} { 
  112.                 # Window attribute
  113.                 set htmlActiveCache windows
  114.                 if {[catch {htmlAskURL $attr $required [lindex $values $i]} v]} {
  115.                     if {$v != "Skip rest!"} {
  116.                         error ""
  117.                     } elseif {!$required} {
  118.                         set i [llength $allatts]
  119.                     } else {
  120.                         set v ""
  121.                     }
  122.                 } elseif {[string length $v]} {
  123.                     append text [htmlWrapTag "[htmlSetCase $attr][htmlAddQuotes $v]"]
  124.                 }
  125.             } elseif {[lsearch $NumberAttrs "$attr*"] >= 0} { 
  126.                 # Number attribute
  127.                 if {[catch {htmlAskNumber $used $attr $required [lindex $values $i]} v]} {
  128.                     if {$v != "Skip rest!"} {
  129.                         error ""
  130.                     } elseif {!$required} {
  131.                         set i [llength $allatts]
  132.                     } else {
  133.                         set v ""
  134.                     }
  135.                 } elseif {[string length $v]} {
  136.                     append text [htmlWrapTag "[htmlSetCase $attr][htmlAddQuotes $v]"]
  137.                 }
  138.             } else { 
  139.                 # other attribute
  140.                 if {$htmlFirstAttr && $promptNoisily} {beep}
  141.                 if {[catch {htmlStatusAskAttr $used $attr $required [lindex $values $i]} v]} {
  142.                     if {$v != "Skip rest!"} {
  143.                         error ""
  144.                     } elseif {!$required} {
  145.                         set i [llength $allatts]
  146.                     } else {
  147.                         set v ""
  148.                     }
  149.                 } elseif {[string length $v]} {
  150.                     htmlOpenExtraThings $used $attr $v
  151.                     if {[lsearch -exact $eventatts $attr] < 0} {
  152.                         set attr [htmlSetCase $attr]
  153.                     }
  154.                     append text [htmlWrapTag "$attr[htmlAddQuotes $v]"]
  155.                 }
  156.             }
  157.             if {![string length $v] && $required } {
  158.                 alertnote "You must give $attr a value."
  159.                 incr i -1
  160.             } 
  161.         } else { 
  162.             # yes-no attribute
  163.             if {$htmlFirstAttr && $promptNoisily} {beep}
  164.             set v ""
  165.             set yn no
  166.             if {[lindex $values $i] == "1"} {set yn yes}
  167.             set flash ""
  168.             if {$htmlFirstAttr && $HTMLmodeVars(flashStatusBar)} {set flash -f}
  169.             while {[catch {eval [concat statusPrompt $flash [list "${used}:$attr \[$yn\] "] htmlStatusAskYesOrNo]} v]} {
  170.                 if {$v == "Cancel all!"} {
  171.                     message "Cancel"
  172.                     error ""
  173.                 }
  174.                 if {$v == "Skip rest!"} {
  175.                     set i [llength $allatts]
  176.                     break
  177.                 }
  178.                 if {$v == "No value"} {
  179.                     set v no
  180.                     break
  181.                 }
  182.             }
  183.             if {$v == ""} {set v $yn}
  184.             if {$v == "yes"} {append text [htmlWrapTag [htmlSetCase $attr]]}
  185.         }
  186.     }
  187.  
  188.     # Some tests that input is ok.
  189.     if {[htmlFontBaseTest $text "message"]} {beep; set text ""}
  190.     if {$elem == "A" && [htmlATest $text "message"]} {beep; set text ""}
  191.     if {$elem == "FRAMESET" && [htmlFramesetTest $text "message"]} {beep; set text ""}
  192.     if {$elem == "SPACER" && [htmlSpacerTest $text "message"]} {beep; set text ""}
  193.     if {$elem == "AREA" && [htmlAreaTest $text "message"]} {beep; set text ""}
  194.     if {[string length $text] } {append text ">"}
  195.     catch {unset htmlActiveUsed}
  196.     catch {unset htmlActiveElem}
  197.     catch {unset htmlActiveAttr}
  198.     catch {unset htmlActiveCache}
  199.     catch {unset htmlActiveWidth}
  200.     catch {unset htmlActiveHeight}
  201.     return ${text}
  202. }
  203.  
  204. # Choose a color name or add a color number
  205.  
  206. proc htmlAskColor {attr required default} {
  207.     global  HTMLmodeVars htmlColorTabSeen htmlActiveUsed htmlColorName
  208.     global  basicColors htmluserColors htmlColors htmlActiveColor htmlFirstAttr
  209.     
  210.     set promptNoisily $HTMLmodeVars(promptNoisily)
  211.     
  212. # put users colours first
  213.     set htmlColors [lsort [array names htmluserColors]]
  214.      append htmlColors " " $basicColors
  215.      
  216.      while {1} {
  217.          # Loop until input is valid or everything is cancelled, then something is returned
  218.          if {$htmlFirstAttr && $promptNoisily} {beep}
  219.          set htmlColorTabSeen 0
  220.          set pr ""
  221.          if {!$required} { set pr "(optional) "}
  222.          append pr ${htmlActiveUsed}:${attr}
  223.          if {$default != ""} {append pr " \[$default\] "}
  224.         set flash ""
  225.         if {$htmlFirstAttr && $HTMLmodeVars(flashStatusBar)} {set flash -f}
  226.          while {[catch {eval [concat statusPrompt $flash [list $pr] htmlColorStatusFunc]} r]} {
  227.              if {$r == "Cancel all!"} {
  228.                  message "Cancel"
  229.                  error ""
  230.              }
  231.              if {$r == "Continue!"} {
  232.                  set r $htmlActiveColor
  233.                  unset htmlActiveColor
  234.                  break
  235.              }
  236.              if {$r == "Skip rest!"} {error "Skip rest!"}
  237.              if {$r == "No value"} {return}
  238.          }
  239.          set r [string trim $r]
  240.          if {$r == ""} {return $default}
  241.          # Users own color?
  242.          if {[info exists htmluserColors($r)]} {return $htmluserColors($r)}
  243.          # Predefined color?
  244.          if {[info exists htmlColorName($r)]} {
  245.              return $htmlColorName($r)
  246.          } else {
  247.              set col [htmlCheckColorNumber $r]
  248.              if {$col != 0} {
  249.                  return $col
  250.              } else {
  251.                  alertnote "$r is not a valid color number. It should be of the form #RRGGBB."
  252.              }
  253.          }
  254.      }
  255. }
  256.  
  257. proc htmlColorStatusFunc {curr c} {
  258.     global  htmlActiveAttr htmlColorTabSeen htmlColorName
  259.     global htmlColors htmlActiveColor htmlActiveUsed
  260.     
  261.     if {$c == "\032"} {
  262.         error "Cancel all!"
  263.     }
  264.     if {$c == "\021"} {error "Skip rest!"}
  265.     if {$c == "\004"} {error "No value"}
  266.     # ctrl-f is new color.
  267.     if {$c == "\006"} {
  268.         set newcolor [htmlAddNewColor]
  269.         if {[string length $newcolor]} {
  270.             set htmlActiveColor $newcolor
  271.             error "Continue!"
  272.         } else {
  273.             return
  274.         }
  275.     }
  276.     
  277.     if {$c != "\t"} {
  278.         set htmlColorTabSeen 0
  279.         return $c
  280.     }
  281.  
  282.     set matches {}
  283.     set attr $htmlActiveAttr
  284.     foreach w $htmlColors {
  285.         if {[string match "$curr*" $w]} {
  286.             lappend matches $w
  287.         }
  288.     }
  289.     if {![llength $matches]} {
  290.         beep
  291.     } else {
  292.         if {$htmlColorTabSeen} {
  293.             if {[catch {listpick -p ${htmlActiveUsed}:${htmlActiveAttr} $matches} ret]} {
  294.                 set ret ""
  295.             }
  296.             if {[string length $ret]} {
  297.                 set htmlActiveColor $ret
  298.                 error "Continue!"
  299.             }
  300.             set htmlColorTabSeen 0
  301.         } else {
  302.             set htmlColorTabSeen 1
  303.             set ret [string range [largestPrefix $matches] [string length $curr] end]
  304.         }
  305.         return $ret
  306.     }
  307.     return
  308. }
  309.  
  310.  
  311. # HREF attributes are handled as a listpick from a cached list
  312. proc htmlAskURL {attr required default} {
  313.     global htmlURLTabSeen htmlFirstAttr
  314.     global HTMLmodeVars htmlActiveUsed htmlActiveCache htmlActiveURL
  315.     
  316.     if {$htmlFirstAttr && $HTMLmodeVars(promptNoisily)} {beep}
  317.     set htmlURLTabSeen 0
  318.     if {!$required} { set pr "(optional) "}
  319.     append pr ${htmlActiveUsed}:${attr}
  320.     if {$default != ""} {append pr " \[$default\] "}
  321.     set flash ""
  322.     if {$htmlFirstAttr && $HTMLmodeVars(flashStatusBar)} {set flash -f}
  323.     while {[catch {eval [concat statusPrompt $flash [list $pr] htmlURLStatusFunc]} r]} {
  324.         if {$r == "Cancel all!"} {
  325.             message "Cancel"
  326.             error ""
  327.         }
  328.         if {$r == "Continue!"} {
  329.             set r $htmlActiveURL
  330.             unset htmlActiveURL
  331.             break
  332.         }
  333.         if {$r == "Skip rest!"} {error "Skip rest!"}
  334.         if {$r == "No value"} {return}
  335.     }
  336.     set r [string trim $r]
  337.     htmlAddToCache $htmlActiveCache $r
  338.     if {$r == ""} {return $default}
  339.     return $r
  340. }
  341.  
  342.  
  343. proc htmlURLStatusFunc {curr c} {
  344.     global HTMLmodeVars  htmlActiveAttr htmlURLTabSeen htmlActiveCache htmlActiveURL
  345.     global htmlActiveUsed htmlActiveWidth htmlActiveHeight
  346.     
  347.     if {$c == "\032"} {
  348.         error "Cancel all!"
  349.     }
  350.     if {$c == "\021"} {error "Skip rest!"}
  351.     if {$c == "\004"} {error "No value"}
  352.     if {$htmlActiveCache == "windows"} {set URLs {_self _top _parent _blank}}
  353.     append URLs " " $HTMLmodeVars($htmlActiveCache)
  354.     
  355.     # ctrl-f for file dialog.
  356.     if {$c == "\006"} {
  357.         if {$htmlActiveCache == "windows"} {
  358.             beep
  359.             return
  360.         }
  361.         set newURL [htmlGetFile]
  362.         if {[string length $newURL]} {
  363.             set htmlActiveURL [lindex $newURL 0]
  364.             if {[llength [set nnn [lindex $newURL 1]]] && $htmlActiveAttr == "SRC="} {
  365.                 set htmlActiveWidth [lindex $nnn 0]
  366.                 set htmlActiveHeight [lindex $nnn 1]
  367.             }
  368.             error "Continue!"
  369.         } else {
  370.             return
  371.         }
  372.     }
  373.  
  374.     if {$c != "\t"} {
  375.         set htmlURLTabSeen 0
  376.         return $c
  377.     }
  378.  
  379.     set matches {}
  380.     foreach w $URLs {
  381.         if {[string match "$curr*" $w]} {
  382.             lappend matches $w
  383.         }
  384.     }
  385.     if {![llength $matches]} {
  386.         beep
  387.     } else {
  388.         if {$htmlURLTabSeen} {
  389.             if {[catch {listpick -p ${htmlActiveUsed}:${htmlActiveAttr} $matches} ret]} {
  390.                 set ret ""
  391.             }
  392.             if {[string length $ret]} {
  393.                 set htmlActiveURL $ret
  394.                 error "Continue!"
  395.             }
  396.             set htmlURLTabSeen 0
  397.         } else {
  398.             set htmlURLTabSeen 1
  399.             set ret [string range [largestPrefix $matches] [string length $curr] end]
  400.         }
  401.         return $ret
  402.     }
  403.     return
  404. }
  405.  
  406. proc htmlStatusAskAttr {used attr required default} {
  407.     global htmlAttrTabSeen htmlActiveInput htmlFirstAttr HTMLmodeVars
  408.  
  409.     set htmlAttrTabSeen 0
  410.     if {!$required} {
  411.         set pr "(optional) "
  412.     } else {
  413.         set pr {}
  414.     }
  415.     if {$used == "LI IN UL" || $used == "LI IN OL"} { # these two are special
  416.          append pr LI:$attr
  417.     } else {
  418.         append pr ${used}:$attr
  419.     }
  420.     if {$default != ""} {append pr " \[$default\] "}
  421.     set v ""
  422.     set flash ""
  423.     if {$htmlFirstAttr && $HTMLmodeVars(flashStatusBar)} {set flash -f}
  424.     while {[catch {eval [concat statusPrompt $flash [list $pr] htmlAttrStatusFunc]} v]} {
  425.         if {$v == "Cancel all!"} {
  426.             message "Cancel"
  427.             error ""
  428.         }
  429.         if {$v == "Continue!"} {
  430.             set v $htmlActiveInput
  431.             unset htmlActiveInput
  432.             break
  433.         }
  434.         if {$v == "Skip rest!"} {error "Skip rest!"}
  435.         if {$v == "No value"} {return}
  436.     }
  437.     
  438.     # Trim only if it's only spaces.
  439.     if {[string trim $v] == ""} {set v ""}
  440.     if {$v == ""} {return $default}
  441.      # if there are choices, check if the user has typed one.
  442.     set choices [htmlGetChoices $used]
  443.     
  444.     set matches {}
  445.     set areChoices [string match "*${attr}*" $choices]
  446.  
  447.     if {!$areChoices} {
  448.         return $v
  449.     } else {
  450.         foreach w $choices {
  451.             if {($used == "LI IN OL" || $used == "OL") && $attr == "TYPE="} { # special case
  452.                 set c ${attr}$v
  453.             } else {
  454.                 set c [string toupper "${attr}${v}*"]    
  455.             }
  456.             if {[string match "${c}*" $w]} {
  457.                 lappend matches  $w 
  458.             }
  459.         } 
  460.         # if unique extension, add what's needed, otherwise return nothing.
  461.         if {[llength $matches] == 1 && [string length $v]} {
  462.             set ret [string range $matches [string length $attr] end]
  463.             if {($used != "LI IN OL" && $used != "OL") || $attr != "TYPE="} {
  464.                 set ret [htmlSetCase $ret] 
  465.             }
  466.             return $ret
  467.         } else {
  468.             return
  469.         }
  470.     }
  471. }
  472.  
  473. # CDATA element attribute, status window match completion
  474. proc htmlAttrStatusFunc {curr c} {
  475.     global htmlActiveUsed htmlActiveAttr htmlAttrTabSeen htmlActiveInput
  476.  
  477.     if {$c == "\032"} {error "Cancel all!"}
  478.     if {$c == "\021"} {error "Skip rest!"}
  479.     if {$c == "\004"} {error "No value"}
  480.     # should we set the case or not (are there predefined choices)?
  481.     set choices [htmlGetChoices $htmlActiveUsed]
  482.     set matches {}
  483.     set attr $htmlActiveAttr
  484.     set areChoices [string match "*${attr}*" $choices]
  485.     foreach w $choices {
  486.         if {($htmlActiveUsed == "LI IN OL" ||  $htmlActiveUsed == "OL") \
  487.             && $attr == "TYPE="} {     # special case
  488.             if {[string match "${attr}${curr}*" $w]} {
  489.                 lappend matches [string range $w [string length $attr] end]
  490.             }
  491.         } elseif {[string match [string toupper "${attr}${curr}*"] $w]} {
  492.             lappend matches [string range $w [string length $attr] end]
  493.         }
  494.     }
  495.     
  496.     if {$c != "\t" } {
  497.         set htmlAttrTabSeen 0
  498.         if {$areChoices} {
  499.         # check if the last character matches
  500.             set matches {}
  501.             foreach w $choices {
  502.                 if {[string match [string toupper "${attr}${curr}${c}*"] $w]} {
  503.                     lappend matches [string range $w [string length $attr] end]
  504.                 }
  505.             }
  506.             if {[llength $matches]} { 
  507.                 if {($htmlActiveUsed != "LI IN OL" &&  $htmlActiveUsed != "OL") \
  508.                     || $attr != "TYPE="} { # special case 
  509.                     set c [htmlSetCase $c] 
  510.                 }
  511.                 return $c
  512.             } else {
  513.                 beep
  514.                 return
  515.             } 
  516.         } else {
  517.             return $c
  518.         }
  519.     }
  520.     
  521.     # it's a tab
  522.     if {![llength $matches]} {
  523.         beep
  524.     } else {
  525.         if {$htmlAttrTabSeen} {
  526.             if {[catch {listpick -p ${htmlActiveUsed}:${htmlActiveAttr} $matches} ret]} {
  527.                 set ret ""
  528.             }
  529.             if {[string length $ret]} {
  530.                 set htmlActiveInput $ret
  531.                 error "Continue!"
  532.             }
  533.             set htmlAttrTabSeen 0
  534.         } else {
  535.             set htmlAttrTabSeen 1
  536.             set ret [string range [largestPrefix $matches] [string length $curr] end]
  537.         }
  538.         if {($htmlActiveUsed != "LI IN OL" &&  $htmlActiveUsed != "OL") \
  539.         || $attr != "TYPE="} { 
  540.             # special case 
  541.             set ret [htmlSetCase $ret] 
  542.         }
  543.         return $ret
  544.     }
  545.     return
  546. }
  547.  
  548. # ask for an attribute which is a number. Returns "" if input is not valid.
  549. proc htmlAskNumber {item attr required default} {
  550.     global HTMLmodeVars htmlActiveWidth htmlActiveHeight htmlFirstAttr
  551.     
  552.     set promptNoisily $HTMLmodeVars(promptNoisily)
  553.     
  554.     # loop until input is valid, then something is returned
  555.     while {1} { 
  556.         if {$htmlFirstAttr && $promptNoisily} {beep}
  557.         set pr ""
  558.         if {!$required} { set pr "(optional) "}
  559.         # these two are special
  560.         if {$item == "LI IN UL" || $item == "LI IN OL"} { 
  561.             append pr LI:$attr
  562.         } else {
  563.             append pr ${item}:$attr
  564.         }
  565.         if {$item == "IMG" && $attr == "WIDTH=" && $htmlActiveWidth != ""} {
  566.             append pr " \[$htmlActiveWidth\] "
  567.         } elseif {$item == "IMG" && $attr == "HEIGHT=" && $htmlActiveHeight != ""} {
  568.             append pr " \[$htmlActiveHeight\] "
  569.         } elseif {$default != ""} {
  570.             append pr " \[$default\] "
  571.         }
  572.         set flash ""
  573.         if {$htmlFirstAttr && $HTMLmodeVars(flashStatusBar)} {set flash -f}        
  574.         while {[catch {eval [concat statusPrompt $flash [list $pr] htmlNumberStatusFunc]} r]} { 
  575.             if {$r == "Cancel all!"} {
  576.                 message "Cancel"
  577.                 error ""
  578.             }
  579.             if {$r == "Skip rest!"} {error "Skip rest!"}
  580.             if {$r == "No value"} {return}
  581.         }
  582.         
  583.         set r [string trim $r]
  584.         # if no input, return default
  585.         if {$r == ""} {
  586.             if {$item == "IMG" && $attr == "WIDTH=" && $htmlActiveWidth != ""} {
  587.                 return $htmlActiveWidth
  588.             } elseif {$item == "IMG" && $attr == "HEIGHT=" && $htmlActiveHeight != ""} {
  589.                 return $htmlActiveHeight
  590.             } else {
  591.                 return $default
  592.             }
  593.         }
  594.         # check that input is valid.
  595.         set numcheck [htmlCheckAttrNumber $item $attr $r]
  596.         if {$numcheck == 1} {
  597.             return $r 
  598.         } else {
  599.             alertnote "Invalid input. $numcheck"
  600.         }
  601.     }
  602. }
  603.  
  604. proc htmlNumberStatusFunc {curr c} {
  605.  
  606.     if {$c == "\032"} {error "Cancel all!"}
  607.     if {$c == "\021"} {error "Skip rest!"}
  608.     if {$c == "\004"} {error "No value"}
  609.     if {[lsearch -exact {+ - 0 1 2 3 4 5 6 7 8 9 %} $c] >=0 } {
  610.         return $c
  611.     } else {
  612.         beep
  613.     }
  614. }
  615.  
  616. # Force yes or no in the status window
  617. proc htmlStatusAskYesOrNo {curr c} {
  618.     if {$c == "\032"} {error "Cancel all!"}
  619.     if {$c == "\021"} {error "Skip rest!"}
  620.     if {$c == "\004"} {error "No value"}
  621.     set c [string tolower $c]
  622.     if {$curr == ""} {
  623.         if {$c == "n"} {return "no"}
  624.         if {$c == "y"} {return "yes"}
  625.     }
  626.     beep
  627.     return
  628. }
  629.